package com.example.chapter6.interceptor;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class JwtInterceptor implements HandlerInterceptor {
    private static final String SECRET_KEY = "your_secret_key";

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
// 从请求头中获取 Authorization 字段的值
        String token = request.getHeader("Authorization");
// 检查 Token 是否存在并以“Bearer ”开头
        if (token != null && token.startsWith("Bearer ")) {
// 去除 Token 的“Bearer ”前缀
            token = token.substring(7);
            try {
                // 解析 Token
                Claims claims = Jwts.parser()
                        .setSigningKey(SECRET_KEY) // 设置用于验证签名的密钥
                        .parseClaimsJws(token) // 解析 JWT
                        .getBody(); // 获取 JWT 的负载部分（claims）
                // 可以根据需要将 claims 绑定到请求中，或进行其他处理
                // request.setAttribute("claims", claims);
            } catch (SignatureException e) {
                // 如果签名验证失败，发送 401 错误响应
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                        "Invalid token.");
                return false; // 阻止请求继续处理
            }
        }
        return true; // 如果 JWT 有效或不需要 JWT，则允许请求继续处理
    }
}
